package calvin.study.rabbitmq.mq;


import java.util.Date;

import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import calvin.study.rabbitmq.dao.RabbitMqMessageLogDao;
import calvin.study.rabbitmq.model.order.Order;
import calvin.study.rabbitmq.model.rabbitmq.enums.OrderSendStatusEnum;
import cn.hutool.json.JSONUtil;
@Component
public class RabbitOrderSender {
    //自动注入RabbitTemplate模板类
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private RabbitMqMessageLogDao RabbitMqMessageLogDao;
    
    //在构造函数之后执行，init()方法之前执行
    //修饰非静态方法，方法会在服务器加载Servlet时运行，并只会被服务器执行一次。
//    @PostConstruct
//	public void confirmCallBack() {
//		rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
//			@Override
//			public void confirm(CorrelationData correlationData, boolean ack, String cause) {
//				System.err.println("消息唯一的id correlationData: " + correlationData);
//				System.err.println("cause: " + cause);
//				String messageId = correlationData.getId();
//				System.err.println("ack:" + ack);
//				if (ack) {
//					// 如果confirm返回成功 则进行更新
//					RabbitMqMessageLogDao.changeBrokerMessageLogStatus(messageId,
//							OrderSendStatusEnum.ORDER_SUCCESS.getCode(), new Date());
//				} else {
//					// 失败则进行具体的后续操作:重试 或者补偿等手段
//					System.err.println("异常处理...");
//				}
//			}
//		});
//	}

	// 回调函数: confirm确认
	final RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
		@Override
		public void confirm(CorrelationData correlationData, boolean ack, String cause) {

			System.err.println("消息唯一的id correlationData: " + correlationData);
			String messageId = correlationData.getId();
			System.err.println("ack:" + ack);
			if (ack) {
				// 如果confirm返回成功 则进行更新
				RabbitMqMessageLogDao.changeBrokerMessageLogStatus(messageId,
						OrderSendStatusEnum.ORDER_SUCCESS.getCode(), new Date());
			} else {
				// 失败则进行具体的后续操作:重试 或者补偿等手段
				System.err.println("异常处理...");
			}
		}
	};

    //发送消息方法调用: 构建自定义对象消息
    public void sendOrder(Order order) throws Exception {
    	//代表强制发送，即使exchange找不到routingkey对应的队列也会尝试，如果失败则会回调ReturnCallback
    	//rabbitTemplate.setMandatory(true);
    	// 通过实现 ConfirmCallback 接口，消息发送到 Broker 后触发回调，确认消息是否到达 Broker 服务器，也就是只确认是否正确到达 Exchange 中
        rabbitTemplate.setConfirmCallback(confirmCallback);
        //消息唯一ID
        CorrelationData correlationData = new CorrelationData(order.getOrderId());
      
        rabbitTemplate.convertAndSend("topic_order_exchange", "order.toStorage", JSONUtil.toJsonStr(order), correlationData);
    }
    
    public void sendWxMsg(String msgId) throws Exception{
        rabbitTemplate.setConfirmCallback(confirmCallback);
        //消息唯一ID
        CorrelationData correlationData = new CorrelationData(msgId);
      
        rabbitTemplate.convertAndSend("wx_send_msg_exchange", "rk_temp_msg_send", JSONUtil.toJsonStr(msgId), correlationData);
    }
    
    public void sendOrderMsg(String orderId) throws Exception{
        rabbitTemplate.convertAndSend("fanout_order_exchange", "", orderId);
    }

//	@Override
//	public void confirm(CorrelationData correlationData, boolean ack, String cause) {
//		//当前类实现RabbitTemplate.ConfirmCallback接口
//		//重载confirm方法等同于line48行方法
//	}
    
}
